home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
051-075
/
disk_056
/
conpackets
/
conpackets.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
5KB
|
175 lines
/* ConPackets.c - C. Scheppner, A. Finkel, P. Lindsay CBM
* DOS packet example
* Requires 1.2
*/
#include <stdio.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <devices/conunit.h>
#define ACTION_SCREEN_MODE 994L
#define DOSTRUE -1L
#define DOSFALSE 0L
/* Used for checking version */
ULONG DosBase;
/* Globals initialized by findWindow() */
struct Window *conWindow;
struct ConUnit *conUnit;
main()
{
LONG infile;
WORD curX, curY;
if(!(DosBase=(OpenLibrary("dos.library",33))))
cleanexit("\nVersion 1.2 required\n");
if((infile = Input()) <= 0)
cleanexit("\nNo stdin ... Did you RUN this ???\n");
if (! findWindow()) cleanexit("\nNot enough free memory\n");
printf("\033[0 p\014"); /* Turn off cursor, home and clear */
printf("Window = $%lx ConUnit = $%lx\n\n",conWindow, conUnit);
printf("CURSOR LIMITS: XMax = %ld YMax = %ld\n",
conUnit->cu_XMax + 1, conUnit->cu_YMax + 1);
curX = conUnit->cu_XCCP;
curY = conUnit->cu_YCCP;
printf("*<--- here cursor was at position %ld,%ld\n",curX,curY);
/* Move to first position of last line and clear to EOL */
clearLast();
printf("ABSOLUTE CURSOR POSITIONING...");
Delay(100);
clearLast();
setRawCon(DOSTRUE);
printf("RAW MODE: Press ANY key...");
printf(" Hex value = %02lx",(UBYTE)getchar());
/* Maybe they pressed a string key - if so, get rest */
while(WaitForChar(infile,100L)) printf(" %02lx",(UBYTE)getchar());
setRawCon(DOSFALSE);
printf("\nShort demo --- That's it\n");
cleanup();
}
clearLast()
{
printf("\033[%ld;%0H\033[M", conUnit->cu_YMax + 1);
}
cleanexit(s)
char *s;
{
if(*s) printf(s); /* Print error */
cleanup();
exit(0);
}
cleanup()
{
setRawCon(DOSFALSE);
printf("\033[1 p\n"); /* Turn cursor on */
if(DosBase) CloseLibrary(DosBase);
}
/* sendpkt code - A. Finkel, P. Lindsay, C. Scheppner CBM */
LONG setRawCon(toggle)
LONG toggle; /* DOSTRUE (-1L) or DOSFALSE (0L) */
{
struct MsgPort *conid;
struct Process *me;
LONG myargs[8] ,nargs, res1;
me = (struct Process *) FindTask(NULL);
conid = (struct MsgPort *) me->pr_ConsoleTask;
myargs[0]=toggle;
nargs = 1;
res1 = (LONG)sendpkt(conid,ACTION_SCREEN_MODE,myargs,nargs);
return(res1);
}
LONG findWindow() /* inits conWindow and conUnit (global vars) */
{
struct InfoData *id;
struct MsgPort *conid;
struct Process *me;
LONG myargs[8] ,nargs, res1;
/* Alloc to insure longword alignment */
id = (struct InfoData *)AllocMem(sizeof(struct InfoData),
MEMF_PUBLIC|MEMF_CLEAR);
if(! id) return(0);
me = (struct Process *) FindTask(NULL);
conid = (struct MsgPort *) me->pr_ConsoleTask;
myargs[0]=((ULONG)id) >> 2;
nargs = 1;
res1 = (LONG)sendpkt(conid,ACTION_DISK_INFO,myargs,nargs);
conWindow = (struct Window *)id->id_VolumeNode;
conUnit = (struct ConUnit *)
((struct IOStdReq *)id->id_InUse)->io_Unit;
FreeMem(id,sizeof(struct InfoData));
return(res1);
}
LONG sendpkt(pid,action,args,nargs)
struct MsgPort *pid; /* process indentifier ... (handlers message port ) */
LONG action, /* packet type ... (what you want handler to do ) */
args[], /* a pointer to a argument list */
nargs; /* number of arguments in list */
{
struct MsgPort *replyport;
struct StandardPacket *packet;
LONG count, *pargs, res1;
replyport = (struct MsgPort *) CreatePort(NULL,0);
if(!replyport) return(NULL);
packet = (struct StandardPacket *)
AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);
if(!packet)
{
DeletePort(replyport);
return(NULL);
}
packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
packet->sp_Pkt.dp_Port = replyport;
packet->sp_Pkt.dp_Type = action;
/* copy the args into the packet */
pargs = &(packet->sp_Pkt.dp_Arg1); /* address of first argument */
for(count=0;count < nargs;count++)
pargs[count]=args[count];
PutMsg(pid,packet); /* send packet */
WaitPort(replyport);
GetMsg(replyport);
res1 = packet->sp_Pkt.dp_Res1;
FreeMem(packet,(long)sizeof(struct StandardPacket));
DeletePort(replyport);
return(res1);
}